package com.tdam2011.grupo06.control;

import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.gui.SetPreferenceFiltrarMensajes;
import com.tdam2011.grupo06.gui.ListadoMensajes.ItemMensajeAdapter;
import com.tdam2011.grupo06.gui.ListadoMensajesBob.ItemMensajeBobAdapter;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.ItemHistorial;
import com.tdam2011.grupo06.model.MensajeBob;
import com.tdam2011.grupo06.network.BobMessageParserSax;

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
 
public class GestorMensajes {

	private Context context;
	private boolean actualizar = false;
	private ItemMensajeBobAdapter adapter;
	
	public GestorMensajes(Context c)
	{
		context = c;
	}
	
	public GestorMensajes(Context c, ItemMensajeBobAdapter a)
	{
		context = c;
		adapter = a;
	}
	
	public void actualizar()
	{
		actualizar = true;
	}	
		
	public ItemMensajeAdapter cargarMensajes(ItemMensajeAdapter adapter)
	{
		BobMessageParserSax bobMessageParserSax = new BobMessageParserSax();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		DatabaseHelper db = DatabaseHelper.getInstance(context);
		Date aux;
		if(db.getMensajesBobCountRecibidos()==0)
		{
			aux = new Date(0);
		}
		else
		{
			aux = db.getLastMensajesBobRecibido(new MensajeBob()).getFecha();
		}
		List<MensajeBob> listaMensajes = bobMessageParserSax.parseMessages(myPreference.getString("nombreUsuario", ""), myPreference.getString("contrasenaUsuario", ""), aux);
		Iterator<MensajeBob> iter = listaMensajes.iterator();
		while(iter.hasNext())
		{
			MensajeBob mesj = iter.next();
			mesj.setUsuario(mesj.getNombre());
			mesj.setTipo(MensajeBob.recibido);
			int idContacto = db.getTableIdbyUser(mesj.getUsuario());
			if(idContacto==0)
			{
				Contacto c = new Contacto();
				c.setUsuario(mesj.getUsuario());
				idContacto = (int) db.addContacts(c);
			}
			Contacto c = new Contacto();
	    	c.setTableID(idContacto);
	    	c = db.getContactByTableId(c);
			mesj.setIdContacto(c.getTableID());
			db.addMensajeBob(mesj);
		}
		
		ContentResolver cr = context.getContentResolver();
		
		Cursor cur = db.getAllContacts();
		while (cur.moveToNext()) 
	    {
			int idContacto = cur.getInt(cur.getColumnIndex(DatabaseHelper.colDBID));
			Contacto contactAAgregar = new Contacto(idContacto);
			contactAAgregar.setTableID(cur.getInt(cur.getColumnIndex(DatabaseHelper.colTableID)));
			if(db.getCountMensajesBobOfContactoByTableId(contactAAgregar)>0)
			{
				contactAAgregar.setUsuario(cur.getString(cur.getColumnIndex(DatabaseHelper.colUser)));
				if(idContacto>0 && adapter.getContactoById(contactAAgregar.getTableID())==null)
				{
					Cursor cCur = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, ((long) idContacto)), null, null, null, null);
		    		if (cCur.moveToFirst()) 
		    		{
		    			contactAAgregar.setNombre(cCur.getString(cCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));		        		
				        Uri uriPhoto = StrUriPhoto.getInstance().getPhotoUriById(context, idContacto);
				        contactAAgregar.setPhotoUri(uriPhoto);
		    		}
		    		cCur.close();
		    		adapter.addContacto(contactAAgregar);
				}
	    		
	    		MensajeBob mensajeAAgreagar = new MensajeBob();
	    		mensajeAAgreagar.setIdContacto(contactAAgregar.getTableID());
	    		mensajeAAgreagar = db.getLastMensajesBobofConctac(mensajeAAgreagar,myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_RECIBIDOS, true),myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_ENVIADOS, true));
	    		mensajeAAgreagar.setUsuario(contactAAgregar.getUsuario());
	    		
	    		if(myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_TODOS, true))
		    	{
	    			adapter.addItemBob(mensajeAAgreagar);
		    	}
		        else
		        {
		        	boolean contacto = true;
		        	boolean contenido = true;
		        	boolean none = true;
		        	
		        	if(myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_DE_CONTACTOS, true)){if(idContacto<=0){contacto=false;}}
		        	
		        	if(mensajeAAgreagar.getId()<=0){contenido=false;}
		        	
		        	if(!myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_DE_CONTACTOS, true)
			        		&& !myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_RECIBIDOS, true) 
			        		&& !myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_ENVIADOS, true)) {
			        		none=false;
			        	}
		        	
		        	if(contacto && contenido && none)
		        	{
		        		adapter.addItemBob(mensajeAAgreagar);
		        	}
		        }
			}
 		}
		cur.close();
        
		Comparator<ItemHistorial> comparator = getComparator();
        if(comparator!=null)
        {
        	adapter.ordenarMensajes(comparator);
        }
        else
        {
        	adapter.ordenarMensajes(ItemHistorial.comparadorFechaDesc);
        }
        
        return adapter;
	}
	
	public boolean verificarMensajes(ItemMensajeAdapter adapter) 
	{
		BobMessageParserSax bobMessageParserSax = new BobMessageParserSax();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		Date aux;
		if(DatabaseHelper.getInstance(context).getMensajesBobCountRecibidos()==0)
		{
			aux = new Date(0);
		}
		else
		{
			aux = DatabaseHelper.getInstance(context).getLastMensajesBobRecibido(new MensajeBob()).getFecha();
		}
		List<MensajeBob> listaMensajes = bobMessageParserSax.parseMessages(myPreference.getString("nombreUsuario", ""), myPreference.getString("contrasenaUsuario", ""), aux);
		if(actualizar) {actualizar = false; return true;}
    	if(listaMensajes.size()>0){return true;}
    	if(adapter.getCantMen()!=DatabaseHelper.getInstance(context).getMensajesBobCount()) {return true;}
		return false;
	}
	
	private Comparator<ItemHistorial> getComparator() 
	{
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
    	String[] order = context.getResources().getStringArray(R.array.ordenamietoMensajes);
    	String orden = myPreference.getString("ordenamiento", "");
		int i;
    	for (i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			break;
    		}
    	}
    	switch (i) 
    	{
    		case 0:
    			return MensajeBob.comparadorFechaAsc;
    		case 1:
    			return MensajeBob.comparadorFechaDesc;
    		default:
    			return null;
		}
	}
	
	public boolean isComparatorDesc() 
	{
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
    	String[] order = context.getResources().getStringArray(R.array.ordenamietoMensajes);
    	String orden = myPreference.getString("ordenamiento", "");
		int i;
    	for (i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			break;
    		}
    	}
    	switch (i) 
    	{
    		case 0:
    			return false;
    		case 1:
    			return true;
    		default:
    			return true;
		}
	}
	
	public Contacto cargarMensajesUsuario(int idContacto)
	{
		ContentResolver cr = context.getContentResolver();
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
		Contacto usuario = new Contacto();
		usuario.setTableID(idContacto);
		usuario = DatabaseHelper.getInstance(context).getContactByTableId(usuario);
		if(usuario.getDbId()>0){
	        Cursor cursor = cr.query(ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (long)usuario.getDbId()), null, null, null, null);
	        if (cursor.moveToNext()) 
	        {
	        	String nombre = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
		        usuario.setNombre(nombre);
		        usuario.setPhotoUri( StrUriPhoto.getInstance().getPhotoUriById(context, usuario.getDbId()) );
		    }
	        cursor.close();
		}
        
        MensajeBob mensaje;
    	Cursor cur = DatabaseHelper.getInstance(context).getAllMensajesBobOfContactoByTableId(usuario,myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_RECIBIDOS, true),myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_ENVIADOS, true));
        if (cur.getCount() > 0) 
        {
		    while (cur.moveToNext()) 
		    {
		    	int id = cur.getInt(cur.getColumnIndex(DatabaseHelper.mensajeID));
		    	Date date = new Date(cur.getLong(cur.getColumnIndex(DatabaseHelper.mensajeFecha)));
		    	int type = cur.getInt(cur.getColumnIndex(DatabaseHelper.mensajeType));
		    	String content = cur.getString(cur.getColumnIndex(DatabaseHelper.mensajeContent));

		        mensaje = new MensajeBob(id, type, date, content,"");
		        mensaje.setIdContacto(idContacto);
		        
		        if(myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_TODOS, true))
		    	{
	    			adapter.addItemBob(mensaje);
		    	}
		        else
		        {
		        	boolean contenido = true;
		        	boolean none = true;
		        	
		        	if(mensaje.getId()<=0){contenido=false;}
		        	
		        	if(!myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_DE_CONTACTOS, true)
			        		&& !myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_RECIBIDOS, true) 
			        		&& !myPreference.getBoolean(SetPreferenceFiltrarMensajes.MENSAJES_ENVIADOS, true)) {
			        		none=false;
			        	}
		        	
		        	if(contenido && none)
		        	{
		        		adapter.addItemBob(mensaje);
		        	}
		        }
	 		}
	    }
        cur.close();
        
        adapter.ordenarMensajes(ItemHistorial.comparadorFechaAsc);
        
        return usuario;
	}
}
